Во вкладке "Сценарий" не ставить галочку в "скрыть миникарту на экранах предпросмотра", затем импортировать .blp или .tga картинку 128х128 и назвать war3mapPreview(.blp\.tga)
Ну у мастера клинка способность то посложнее...
Вот пример:
Для начала нам нужно создать иллюзии героя, а потом скрыть всех их, так же сделав визуальный эффект (если что то зеленые тени, это снаряды).
Оказывается нужно было указать в доступных улучшениях кастера нестандартное улучшение!
В данном случае у некроманта есть улучшение "магия скелетов", так как именно некромант кастует прокачиваемую способность "оживить мёртвых".
Поставь зданию модель dummy.mdx, которая с креплениями, но без видимых частей.
И прикрепи ему на overhead модель ястреба(спецэффект - создать спецэффект на юните)
8gabriel8, стандартные порталы как раз включаются триггером, так же триггерно им можно назначать области телепорта, так же они не ломают карту путей.
Насчет упираются в здание, карту путей ставь от портала, физ размер в 0.
ссылкасмотри раздел "строительство"
иконку нужно менять у способности "строительство", у каждой расы оно разное. У них отсутствует описание, но его можно поменять в
Описание кнопок и горячие клавиши (hot keys) находятся в Units/CommandStrings.txt
Изменить также можно в "дополнительно"->"игровой интерфейс"
чтобы было 2 меню. нужно делать 2 разных юнитов = морф.
пробовал делать через спелбук с кучу игрушечных здании, но так не получится
Кажется я понял в чем дело. В общем, в карте монолит в импорте файлик LoadingScreen.mdx весит 3 кб, когда я его экспортирую на рабочий стол, а затем импортирую обратно в карту с рабочего стола, то он почему-то начинает весить не 3, а 1 кб, а Лоадскрин не показывается при загрузке карты. Но из-за чего это происходит я не знаю.
PhysCraft, читал, там очень мало написано, и совсем не то что я ожидал. В принципе я вроде смог прописать путь по папкам, сделал что бы играла музыка, в игре модели видно, но в редакторе нет, и как я теперь буду в редакторе ландить? Мне импорт для ландшафта нужен. Есть какой-то способ в редакторе тоже видеть?
Редактор не перегружает ресурсы. Тоесть отурыв карту, где используется *Деревня - каменистая тропа*, редактор запомнит этот тайл и при открытии других карт будет использовать именно его.
Можете элементарно проверить закрыв редактор и первой открыть карту с альфа тайлом.
Конечно не забудте убрать галку "Создавать новую карту при открытии" или, что более лучше, используйте JGNP
Это лежит в слк таблице, сам тип юнита это - РО код, 'hpea' - peasant, это целое число, но в 256 ричной системе исчисления.
Были просто функции которые из текста делают РО код, вводишь -spawn h000'и появляется юнит нужного тебе типа...
Друга зачем? Нинада, так толку не будет...
Просто используешь Inject main (vjass) или Define (Cjass) чтобы убрать 1 только строчку из main
//***************************************************************************
//*
//* Map Configuration
//*
//***************************************************************************
//***************************************************************************
//*
//* Main Initialization
//*
//***************************************************************************
//===========================================================================
function main takes nothing returns nothing
call SetCameraBounds(- 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), - 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM))
call SetDayNightModels("Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl")
call NewSoundEnvironment("Default")
call SetAmbientDaySound("SunkenRuinsDay")
call SetAmbientNightSound("SunkenRuinsNight")
call SetMapMusic("Music", true, 0)
call InitBlizzard() // вот и все, удалим и не будет бж объектов.
call InitGlobals()
call InitCustomTriggers()
call RunInitializationTriggers()
endfunction
Совсем забыл, функция main генерируется при сохранении карты в редакторе
Без cjass или vjass придется выколупывать war3map.j (код карты) файл из карты и править ручками в блокнотике, геморойно до безобразия, за то ненужен c\vjass и его знания.
Друга зачем? Нинада, так толку не будет...
Просто используешь Inject main (vjass) или Define (Cjass) чтобы убрать 1 только строчку из main
//***************************************************************************
//*
//* Map Configuration
//*
//***************************************************************************
//***************************************************************************
//*
//* Main Initialization
//*
//***************************************************************************
//===========================================================================
function main takes nothing returns nothing
call SetCameraBounds(- 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), - 3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), - 3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM))
call SetDayNightModels("Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl", "Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl")
call NewSoundEnvironment("Default")
call SetAmbientDaySound("SunkenRuinsDay")
call SetAmbientNightSound("SunkenRuinsNight")
call SetMapMusic("Music", true, 0)
call InitBlizzard() // вот и все, удалим и не будет бж объектов.
call InitGlobals()
call InitCustomTriggers()
call RunInitializationTriggers()
endfunction
Совсем забыл, функция main генерируется при сохранении карты в редакторе
Без cjass или vjass придется выколупывать war3map.j (код карты) файл из карты и править ручками в блокнотике, геморойно до безобразия, за то ненужен c\vjass и его знания.
есть событие - юнит получает урон. в нём отслеживается как жертва, так и наносящий урон. можно хоть через хэш, хоть через структуру Юнита записывать всё, что угодно. Кто от кого конкретно сколько получил урона, кто кому сколько нанёс, сколько провисел на ком-то бафф яда и т.п. (Сначала был loop, а теперь периодический триггер). Каждые N секунд, перебираешь всех юнитов в массиве или списке, и отслеживаешь всё, что надо.
Структура - Unit. У неё есть двойной список с юнитами и уроном от яда (полученным или нанесённым - зависит от того, у кого будет этот список - у жертв или у тех, кто наносит яд). Типа DoubleList. В DoubleList есть элементы DoubleElement. В каждом таком элементе записаны unit и real (урон от яда от этого юнита). При получении урона от яда перебирается список, если юнит уже есть, урон от него (или ему) прибавляется. Если нет, то создаётся новый элемент с новым юнитом.
Периодически у нужных юнитов эти списки перебираются. Всё.
Нет. Я пока хочу достроить карту на GUI, думаю мне осталось дней 10-30 работать, а буду ли следующую делать - под вопросом. Не хочется тратить время на изучение jass из-за пустяка! Однако Я использовал Custom Script, но это было содрано с одного сайта, а вот чтобы делать самому нужно сначала полностью изучить язык. Либо знаю, либо нет, чуть-чуть не считается!
Что касается wait, то если не это то что тогда?
Опытным путём сам установил что в процесс ничего не вклинивается. Можно использовать Триггер как Функцию и ссылаться на него в другом Триггере. По сути, это и есть функция, если глянуть на jass. Вопрос закрыт.
name_to_trigger(string name) {
for (integer index = 0; index < name_array_index; index++) {
if name_array[index] == name {
return trigger_array[index];
}
}
}
Затем регистрируем все триггеры через register_trigger.
А после этого думаем, реально ли у нас столько абилок, что простая последовательность if name == "my_ability" then RunTrigger(my_ability) хуже этого решения
Имена бж функций есть в..blizzard.j, чтобы они не конфликтовали с вашими способностями - чекайте софтом код абилок и близард ж файл, на предмет одинаковых имен и правьте, а так еще советую тулы векса или хеави лок - они сжимают имена и небудет проблем с именами функций и переменных в скрипте.
есть событие - юнит получает урон. в нём отслеживается как жертва, так и наносящий урон. можно хоть через хэш, хоть через структуру Юнита записывать всё, что угодно. Кто от кого конкретно сколько получил урона, кто кому сколько нанёс, сколько провисел на ком-то бафф яда и т.п. (Сначала был loop, а теперь периодический триггер). Каждые N секунд, перебираешь всех юнитов в массиве или списке, и отслеживаешь всё, что надо.
Структура - Unit. У неё есть двойной список с юнитами и уроном от яда (полученным или нанесённым - зависит от того, у кого будет этот список - у жертв или у тех, кто наносит яд). Типа DoubleList. В DoubleList есть элементы DoubleElement. В каждом таком элементе записаны unit и real (урон от яда от этого юнита). При получении урона от яда перебирается список, если юнит уже есть, урон от него (или ему) прибавляется. Если нет, то создаётся новый элемент с новым юнитом.
Периодически у нужных юнитов эти списки перебираются. Всё.
Проблема возникает также при переносе вот этого вот в инициализацию триггера тест.
Но при этом если вместо строки вроде "12345" использовать, например, GetAbilityName('Aloc') - то все работает.
Это какой-то баг со строками?
Еще у меня почему-то происходит фантомный клик по центру карты в начале игры
Вобщем не стоит юзать имена функций напрямую в экзекуте и вообще таймеры лучше
Любая строка ограничена, 256 символов латиницы и вдвое меньше символов кирилицы насколько я помню.
Никак не лечится, краткость сестра таланта и все такое.
имеет смысл открыть раздел ГУИ с плавающим текстом, взять словарик английского и самому попробовать его различные комбинации. Если ответить вкратце - да, это можно сделать
Floating Text - Create floating text that reads (Текст) above DamageEventTarget with Z offset (40.00 + (Random real number between 1.00 and 25.00)), using font size 13.00, color (100.00%, 100.00%, 100.00%), and 0.00% transparency - создает надпись Текст с нужными настройками цвета и смещения по оси Z над нужным нам юнитом. Создавать текст также можно в любой точке
Floating Text - Set the velocity of (Last created floating text) to 75.00 towards 90.00 degrees - Текст будет смещен на 75 ед. с углом смещения 90 градусов
Floating Text - Change (Last created floating text): Disable permanence - не помню, что делает
Floating Text - Change the lifespan of (Last created floating text) to 3.50 seconds - устанавливает время жизни текста 3,5 сек
Floating Text - Change the fading age of (Last created floating text) to 1.40 seconds - заставляет текст медленно гаснуть в течении 1,4 сек, чтобы он не пропадал резко и выглядело красиво
давай поясню, что в ней получилось, а что нет. Во-первых, там три триггера для способности, в Иниц. сражения указано, чтобы гном периодически кидал в героя молот для проверки работы защиты от магии. В trigger 000 указано, чтобы триггер защиты от магии активировался после изучения Змеиной ловкости, тут много нюансов. Например, я просто не знаю, что ты хотел, сделать промахи от магии для всех, включая бандитов, либо лишь для одного героя на карте. Также изначально герой может обладать Змеиной ловкостью, в таком случае этот триггер не нужен, его можно убрать и изначально включить trigger 001. Может быть так, что на карте у нескольких героев есть Змеиная ловкость, тогда надо задавать им переменные в этом триггере. Короче, тут очень много всего, мог бы сделать универсальную систему для всех случаев, но она была бы очень большой, мне просто жалко своего времени на это, для себя сделал то, что требовалось, мне достаточно. Опиши свою ситуацию, куда тебе нужна Змеиная ловкость, действующая и на заклинания, тогда могут быть советы по trigger 000. Во-вторых, в trigger 001 указано случайное срабатывание защиты от магии, примерно как я описывал выше, только немного иначе выглядят:
так как у меня подразумевается, что на карте только один юнит обладает Змеиной ловкостью от заклинаний, то я его и указываю, иначе может понадобиться использовать переменные для юнитов. В действиях идёт проверка на уровень Змеиной ловкости и выставлении шанса на срабатывание промаха заклинания. Если шанс выпал, то герою добавляется Защита от магии от Амулета защиты, но только моя версия этой способности, чтобы не было потом конфликтов с этим предметом у Верховного мага. При этом trigger 001 отключается, чтобы не сработал повторно до того, как в героя способность прилетит, а то вдруг кто-то ещё направит в героя заклинание, вторая Защита от магии ему добавится что ли? Вместе с отключением trigger 001 включается trigger 002, тут отлавливается срабатывание моей Защиты от магии и добавляется всплывающий текст "промах". Как бы понятно, что раз Защита от магии сработала, значит заклинание попало, там воспроизводится соответствующий игровой звук, триггер отключается, защита от магии убирается и опять запускается trigger 001, чтобы ловить дальше заклинания и считать шанс на промах, ну а потом всплывающий текст. В этом случае, если кто-то издалека направил на героя заклинание, и оно получило шанс на промах, trigger 001 отключился, а кто-то рядом тоже направил заклинание, и оно долетело первым, то первое заклинание промахнётся, trigger 001 включится и будет считать шансы на промах заклинаний, но, направленное издалека заклинание в теории долетит и не промахнётся, так как Защиты от магии уже не будет, а шанс на промах для него уже успешно выпал. Если враги не бьют способностями постоянно, то это не критично, но если монстры нападают массово и атакуют способностями с кулдауном 0,1 секунда, то это будет ощутимо. А вот со всплывающим текстом у меня не очень получилось, промах обычный всплывает над тем, кто промахнулся, но как сделать промах от заклинателя, если произошла описанная выше ситуация, когда для одного заклинания срабатывает шанс на промах, а им пользуется другое более быстрое заклинание? Я не знаю. Недавно тут задавался подобный вопрос, я его не посмотрел, правда, но думаю, что там используются не те триггеры, которыми владею. Как вариант можно делать текст не "промах", а "промах магии" над героем со Змеиной ловкостью.
что-то не вижу на скрине как вы пытаетесь запихнуть в if/then/else. Почему должен угадывать
Предположение: ошибка - локальные переменные объявляются всегда первыми. Если там будет какое-то другое действие, а объявление локалок ниже, то это ошибка. Ты вперед, наверное, поставил действие "if/then/else", а потом начал объявлять что-то там,
правильно
local unit u
if (условие) then
действие
endif
не правильно
if (условие) then
local unit u
endif
Локалки вначале функции всегда объявляются. Можете в код конвентировать и посмотреть.
Вообще - работает наивысший показатель, ничего не суммируется и не складывается.
То что ты читал про формулу - скорее всего описывается метод сложения как в доте
Каждый следующий уменьшает шанс попадания на свой % от оставшегося если у тебя есть 40% уворота, то шанс попадения по тебе 60% если у тебя ещё есть 50% уворота, то шанс попадения на 50% (это 30%, а уворот 70%)
В доте организация была через абилку в ~20 уровней с шагом по 5% уровень 1 - шанс 5%, уровень 2 - шанс 10% ... уровень 10 - шанс 50% ...
И значение округлялось в меньшую сторону (если высчитывается у тебя 62,5%, то будет 60%)
. . .
Ещё как вариант - отлавливать физ.атаки и делать промахи триггерно
У меня был практически рабочий вариант без косяков... но не срослось А так вообще кто-то делал через мгновенные атаки дальнего боя с гашением об каменный доспех и нанесением урона по формулам от всех бонусов (через БД), ну тут сам понимаешь...
ну все по стандарту - проверка на вирусы, проверка реестра, чистка реестра, дефрагментация диска, проверка диска, установка в другую директорию, откат на точку восстановления
Я сравнил стандартный и свой звук. Обнаружил, что у меня 2 канала, у стандартного 1. Я перковертировал все свои звуки... Стало лучше, но часть звуков все равно не работает(
Для каждого дерева нужны три модели: обычная, неактивная (с названием Doodads\Terrain\AshenTree\AshenTree0S.mdx, например) и неактивная разрушенная (Doodads\Terrain\AshenTree\AshenTree0D.mdx). У неактивных моделей должна быть только одна анимация — Stand. У первой — только деревце, у второй — только пенёк, соответственно.
Когда с деревом никто не взаимодействует, отображаются неактивные модели. Ты их не заменил, потому такая вот фигня.
Как сделать полноценно работающие деревья с моделями, не заменяющими стандартные, я не знаю. Возможно, никак.
Настраиваешь в РО дерево так чтобы у него была 1 вариация и там текстуру нужно к дереву прописать если она импортирована внимательно изучи все строки связанные с деревом как разрушенный объект.
У меня кончились мыслИ. Привязку к точкам всё что могу тут предложить, а жаль...
ХОТЯ знаешь чё - осенило меня тут - создавай на позиции здания дамик с картой пути в виде буквы О. То есть само здание как бы без текстуры пути, а его огораживает дами с кольцевой текстурой. Таким образом здание никуда не убежит, зато сможет поворачиваться!
Прикрепляю пример. Только себе текстурку поплотнее сделай
Ну чтобы перевести, из градусов в радианы
180° = pi радиан = 3,14...
Если знаешь расположение градусов в окружности (там 2pi = 360°, или pi/2 = 90°)
60° = pi/3 радиан = 3,14/3 = 1,0466
30° = pi/6 радиан = 3,14/6 = 0,5233
Или использовать готовую формулу Angle to Radians => Angle *pi / 180 (формула)
pi/180 = 3,14/180 = 0,01744 (коэффициент, записан в варе в переменную-множитель bj_DEGTORAD)
_________________
Чтобы перевести из радиан в градусы
Использую формулу Radians to Angle => Radians * 180 / pi
1 радиан = 57,32°
0,5 радиан = 0,5 * 180/3,14 = 28,6°
Используют точно также переменную-множитель bj_RADTODEG, но с другим названием. Там было Deg to Rad (перевести в радианы), здесь Rad to Deg (в градусы) тут есть погрешности до десятичных, до сотых и более. Поэтому может не соответствовать. Это как пример. Считал сам. А вообще юзайте готовые переменные и не морочьте голову
код
local unit u = GetTriggerUnit()
local real a = GetUnitFacing(u) * bj_DEGTORAD //GetUitFacing возвращает параметры в градусы, поэтому нужно перевести в радианы
local real x = GetUnitX(u) + 100. * Cos(a)
local real y = GetUnitY(u) + 100. * Sin(a)
//потом то-то делаешь. x, y
xgm.guru/p/wc3/179127тут есть пример карта, на гуи там, но переделать можно и на jass (там кастер двигается в ту сторону, куда смотрит). И пример в качестве кода, если нужно двигать относительно двух точек (сделал пример движение снаряда от Кастера к цели)
фиксировать угол при применении и постоянно выравнивать юнита при периодической проверке
если ставить скорость поворота 0 - у юнита начнутся проблемы с движением
Патиссончик, про центр области не заметил
точка каждый раз создаётся заново и это утечка Патиссончик, есть прога на сайте для записи логов
так же есть дебаг через прелоад на сайте
вот счётчик утечек
Smart096, баг только в этой карте?
в новых картах бага нету?
если да то стоит проверить импортируемые модели и текстуры (мб часть битая)
но с вероятностью в 60% проблема в системе ибо было много жалоб на баги в вин10
» WarCraft 3 / Очередные вопросы по триггерам
» WarCraft 3 / Изображения
» WarCraft 3 / Есть ли такая стандартная способность
» WarCraft 3 / здание
» WarCraft 3 / Монолит
» WarCraft 3 / Нестандартная способность для компьютера
» WarCraft 3 / Тайлы
» WarCraft 3 / Фича
» WarCraft 3 / Очередные вопросы по оптимизации
» WarCraft 3 / Очередные вопросы по оптимизации
» WarCraft 3 / ИИ
» WarCraft 3 / вызов функций
» WarCraft 3 / ИИ
» WarCraft 3 / Execut
» WarCraft 3 / Плавающий текст
» WarCraft 3 / Ловкость
» WarCraft 3 / Своя подсветка функций
» WarCraft 3 / Как настроить шрифт в Jass?
» WarCraft 3 / World Editor
» WarCraft 3 / Позиционный звук
» WarCraft 3 / Импорт Модели Дерева
» WarCraft 3 / Поворот Юнита
» WarCraft 3 / Краши и вылеты из-за триггера.
» WarCraft 3 / Триггер союза